
package com.fjbdxk.beidou.core;

/**
 * byte类型工具类
 *
 * @author huanggy
 * @date 2024/04/07
 * @version 1.0.0
 */
public class ByteUtils {

    private final static String HEX_STR = "0123456789ABCDEF";


    /**
     * 将字节数组翻译成16进制字符串
     *
     * @param buf
     * @return
     */
    public static String toHexString(byte[] buf) {
        StringBuilder sb = new StringBuilder();//使用 StringBuilder 来构建结果字符串
        for (int i = 0; i < buf.length; i++) {
            String str = Integer.toHexString(buf[i]);//使用 Integer.toHexString(buf[i]) 将字节转换为十六进制字符串
            if (str.length() > 2) {
                //如果十六进制字符串的长度大于 2，取最后两个字符（处理负数的情况）
                str = str.substring(str.length() - 2);
            } else if (str.length() < 2) {
                //如果长度小于 2，前面补零（确保每个字节都有两个十六进制字符）
                str = "0" + str;
            }
            sb.append(str);
        }
        //返回结果字符串并将其转换为大写
        return sb.toString().toUpperCase();
    }

    /**
     * 将十六进制字符串转换为字节数组
     * @param hex
     * @return
     */
    public static byte[] hexStr2bytes(String hex) {
        if (hex.length() % 2 != 0) {
            //如果十六进制字符串的长度是奇数，前面补一个零，使其变为偶数长度
            hex = "0" + hex;
        }
        //将字符串转换为大写
        hex = hex.toUpperCase();
        //创建一个字节数组 res，其长度为十六进制字符串长度的一半
        byte[] res = new byte[hex.length() / 2];
        for (int i = 0; i < res.length; i++) {
            //取出每两个字符（表示一个字节）进行转换
            int n = i * 2;
            int n_1 = n + 1;
            char c = hex.charAt(n);
            char c_1 = hex.charAt(n_1);
            //使用 HEX_STR.indexOf(c) 和 HEX_STR.indexOf(c_1) 获取字符对应的数值
            int buf = HEX_STR.indexOf(c);
            int buf_1 = HEX_STR.indexOf(c_1);
            //通过位运算将两个数值合并成一个字节
            res[i] = (byte) (((buf << 4) & 0x000000F0) ^ (buf_1 & 0x0000000f));
        }
        return res;
    }

    /**
     * 截取指定位置的字节数组 start end是数组脚标 从0开始 算start 不算end
     *截取字节数组中的指定范围
     * @param data
     * @param start
     * @param end
     * @return
     */
    public static byte[] subByte(byte[] data, int start, int end) {
        byte[] buf = new byte[end - start];//创建一个新的字节数组 buf，其长度为 end - start
        for (int n = 0, i = start; i < end; i++, n++) {//使用循环将原始字节数组 data 中从 start 到 end 的字节复制到 buf 中
            buf[n] = data[i];//返回新创建的字节数组
        }
        return buf;
    }
}
